Berechnung eines Korrelationskoeffizienten Aufgabe

Werbung
Berechnung eines Korrelationskoeffizienten
Aufgabe:
1.
Erstellen Sie eine Tabelle Verkauf mit den Feldern VERKAUF_ID, PRODUKT_ID und
ANZAHL. Am einfachsten kopieren Sie die Tabelle Hulin.Verkauf. Dabei bedeutet der
Datensatz (7, x, 12): Der Artikel x wurde beim Verkauf 7 insgesamt 12 mal gekauft.
2.
Erstellen Sie ein C-Programm, das für alle Verkäufe den Korrelationskoeffizienten
zwischen der Anzahl der gekauften Stücke von Produkt x und der Anzahl der gekauften
Stücke von Produkt y berechnet. Wird bei einem Verkauf eines der Produkte x oder y
nicht gekauft, so ist die Anzahl auf 0 zu setzen. Verwenden Sie ODBC zur Koppelung an
die Datenbank. Die Formel für den Korrelationskoeffizienten lautet:
n
 x y  n x  y
i
i
n
, mit x 
1
n
 xi und y 
n
yi

n
i

1
i

1
 n 2


2
2
2
  xi  n  x   yi  n  y 
 i 1
 i 1

Dabei sind xi und yi die Ergebnisse einer n-fachen Stichprobe für die Zufallsgrößen x und
y.
i 1
1
n
Lösung:
// Berechnung des Korelationskoeffizienten von Verkaufszahlen
#include <Stdiostr.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <windows.h>
#include <sql.h>
#include <sqlext.h>
#include <odbcinst.h>
#include <math.h>
static char * szDSN = "ORACLE";
RETCODE rc; // Rückgabewert von ODBC-Funktionen
HENV henv; // Umgebungs-Handle
HDBC hdbc; // Verbindungs-Handle
HSTMT hstmt;
// Anweisungs-Handle
char szSQLSTATE[6];
SDWORD nErr;
char msg[200];
SWORD cbmsg;
int ora_in ()
{
SQLAllocEnv(&henv); // Umgebungshandle einrichten
SQLAllocConnect(henv, &hdbc); // Verbindungshandle einr.
rc = SQLConnect(hdbc, (unsigned char *) szDSN, SQL_NTS,
(unsigned char *) "hulin@ora7db", 15, (unsigned char *)
"passwort", 14);
if (rc != SQL_SUCCESS)
{
printf("Fehlerconnect\n");
SQLError(0, 0, hstmt, (unsigned char *) szSQLSTATE, &nErr,
(unsigned char *) msg, sizeof(msg), &cbmsg);
cout << "SQLState= " << szSQLSTATE << "msg " << msg;
return (0);
}
else return (1);
}
float korrelation ()
{
// UWA
int vid;
UCHAR pid[10];
UCHAR produkt1[10] = "x";
UCHAR produkt2[10] = "y";
int zahl;
// sonstige Variable fuer ODBC
SDWORD cbData0, cbData1, cbData2; // Ausgabelaenge der Daten
char * szSQL =
"select * from Verkauf where produkt_id = 'x' or
produkt_id = 'y' order by verkauf_id, produkt_id"; // SQL-Kommando,Cursor
// sonstige Variable
int i = 0;
float ii;
float xsum = 0;
float ysum = 0;
float xqsum = 0;
float yqsum = 0;
float xysum = 0;
float xzahl, yzahl;
int aktvid;
SQLAllocStmt(hdbc, &hstmt); // Verbindungshandle einrichten
// Abfrage ausfuehren
SQLBindCol(hstmt, 1,SQL_INTEGER, &vid, sizeof(vid), &cbData0);
SQLBindCol(hstmt, 2,SQL_C_CHAR, pid, sizeof(pid), &cbData1);
SQLBindCol(hstmt, 3,SQL_INTEGER,&zahl,sizeof(zahl), &cbData2);
rc = SQLExecDirect(hstmt, (unsigned char *) szSQL, SQL_NTS);
// Berechnung
if (rc != SQL_SUCCESS)
{
printf("Fehler_exec\n");
SQLError(0, 0, hstmt, (unsigned char *) szSQLSTATE, &nErr,
(unsigned char *) msg, sizeof(msg), &cbmsg);
cout << "SQLState= " << szSQLSTATE << "msg " << msg;
return (10.0);
}
else
{
for(rc = SQLFetch(hstmt); rc == SQL_SUCCESS; i++) // for1
{
pid[cbData1]='\0';
printf("%s, %s\n",pid, produkt1);
if (!strcmp((const char *) pid,(const char *)produkt1))
{
xzahl = (float)zahl;
aktvid = vid;
rc = SQLFetch(hstmt);
if (!strcmp((const char *)pid,(const char
*)produkt2) && aktvid == vid)
{
yzahl = (float)zahl;
rc = SQLFetch(hstmt);
}
else yzahl = 0;
}
else // pid == produkt2
{
xzahl = 0;
aktvid = vid;
yzahl = (float) zahl;
rc = SQLFetch (hstmt);
}
xsum = xsum + xzahl;
ysum = ysum + yzahl;
xqsum = xqsum + xzahl * xzahl;
yqsum = yqsum + yzahl * yzahl;
xysum = xysum + xzahl * yzahl;
printf("%f, %f, %f, %f, %f, %f,
%f\n",xzahl,yzahl,xsum,ysum,xqsum,yqsum,xysum);
} //end for1
ii = (float) i;
} //end if
return ((xysum - xsum * ysum/ii)/
sqrt((xqsum - xsum *xsum/ii)*(yqsum -ysum * ysum/ii)));
}
int main ()
{
if (ora_in () == 1)
printf ("Korrelationsk.: %f\n", korrelation ());
SQLFreeStmt(hstmt, SQL_DROP); //Aufraeumen
SQLDisconnect(hdbc);
SQLFreeConnect(hdbc);
SQLFreeEnv(henv);
return(TRUE);
}
Herunterladen